// 配置路由
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes';
// 引入store
import store from '@/store'
// 使用插件
Vue.use(VueRouter)
    // console.log(VueRouter.prototype)
    // 重写push
    // 先保存VueRouter原型对象的push方法
let orignPush = VueRouter.prototype.push;
// 重写replace
let orignReplace = VueRouter.prototype.replace;
// 重写push || replace
VueRouter.prototype.push = function(location, resolve, reject) {
    if (resolve && reject) {
        // call与apply的区别 都可以调用函数与上下文一次
        // call传递多个参数用逗号隔开 apply 传递多个参数用数组形式
        orignPush.call(this, location, resolve, reject)
    } else {
        orignPush.call(this, location, () => {}, () => {})
    }
}

VueRouter.prototype.replace = function(location, resolve, reject) {
        if (resolve && reject) {
            // call与apply的区别 都可以调用函数与上下文一次
            // call传递多个参数用逗号隔开 apply 传递多个参数用数组形式
            orignReplace.call(this, location, resolve, reject)
        } else {
            orignReplace.call(this, location, () => {}, () => {})
        }
    }
    // 配置路由实例
let router = new VueRouter({
    mode: 'history',
    // 配置路由
    routes,
    // 滚动行为
    scrollBehavior(to, from, savedPosition) {
        // return 期望滚动到哪个的位置
        return { x: 0, y: 0 }
    }
})
export default router;

// 全局前置守卫 路由跳转前判断
router.beforeEach(async(to, from, next) => {
    // to 跳转到的路由信息 from 从哪个路由来的信息 next 放行
    // next() next('/login')只放行到login next(false) 中断当前导航
    // next()
    // 用户登陆才会有token 未登陆一定没有token
    // 获取仓库中的token
    let token = store.state.user.token;
    let name = store.state.user.userInfo.name
    if (token) {
        // 用户已经登陆 禁止返回login
        if (to.path == '/login' || to.path == '/register') {
            next('/')
        } else {
            // 当跳转不是home路由时 校验有无用户信息
            if (name) {
                next()
            } else {
                // 没有用户信息 派发action 让仓库获取用户信息
                try {
                    // 路由跳转之前获取用户信息
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    // console.log(error.message)
                    // token失效 清除token 
                    await store.dispatch('userLogout')
                    next('/login')
                }
            }
            next()
        }
    } else {
        // 未登录 不能去交易相关页面  支付相关  个人中心
        let toPath = to.path
            // if (toPath == '/trade') {
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // 把想去的路由存到地址栏
            next('/login?redirect=' + toPath)
        } else {
            // 去home search shopcart
            next()
        }
    }
})

// router.beforeEach(async(to, from, next) => {
//     //to:去的那个路由的信息
//     //from:从那个路由而来的信息
//     //next:放行函数!!!!!! 
//     //第一种：next(),放行函数，放行到它想去的路由！！！
//     //第二种:next(path),守卫指定放行到那个路由去?

//     //用户是否登录:取决于仓库里面是否有token！！！
//     //每一次路由跳转之前需要用有用户信息在跳转,没有发请求获取用户信息在跳转！！！！
//     //token
//     let hasToken = store.state.user.token;
//     //用户信息
//     let hasNickName = store.state.user.nickName;
//     //用户登录
//     if (hasToken) {
//         //用户登录了,不能去login
//         if (to.path == "/login") {
//             next('/home');
//         } else {
//             //用户登陆了,而且还有用户信息【去的并非是login】
//             if (hasNickName) {
//                 next();
//             } else {
//                 //用户登陆了,但是没有用户信息 
//                 try {
//                     //发请求获取用户信息以后在放行
//                     await store.dispatch('getUserInfo');
//                     next();
//                 } catch (error) {
//                     //用户没有信息，还携带token发请求获取用户信息【失败】
//                     //token【学生证失效了】
//                     //token失效:本地清空数据、服务器的token通知服务器清除
//                     await store.dispatch('logout');
//                     //回到登录页，重新获取一个新的学生证
//                     next('/login');
//                 }
//             }
//         }
//     } else {
//         //用户未登录||目前的判断都是放行.将来这里会'回手掏'增加一些判断
//         //用户未登录:不能进入/trade、/pay、/paysuccess、/center、/center/myorder  /center/teamorder
//         let toPath = to.path;
//         if (toPath.indexOf('trade') != -1 || toPath.indexOf('pay') != -1 || toPath.indexOf('center') != -1) {
//             next('/login?redirect=' + toPath);
//         } else {
//             next();
//         }
//     }
// });